#!/bin/bash

# =============================================================================
# 新浪彩票定时抓取 - Crontab 自动配置脚本
# 
# 功能：自动生成并安装彩票数据抓取的定时任务
# 
# 执行时间安排：
# - 21:25  福彩双色球、3D、七乐彩开奖结果
# - 21:40  体彩彩种和福彩快乐8开奖结果  
# - 22:10  更新各彩种各奖项中奖信息
# - 23:30  防止彩种各奖项更新延迟，再进行更新一遍
# 
# 使用方法：
#   ./crontab.sh install     # 安装定时任务
#   ./crontab.sh uninstall   # 卸载定时任务
#   ./crontab.sh show        # 显示当前定时任务
#   ./crontab.sh preview     # 预览将要安装的定时任务
# =============================================================================

set -e  # 遇到错误立即退出

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 获取脚本所在目录的绝对路径
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"

# Python执行器智能检测
detect_python_path() {
    # 可能的虚拟环境位置
    local script_venv="$SCRIPT_DIR/venv/bin/python"
    local project_venv="$PROJECT_ROOT/venv/bin/python"
    
    # 优先检查脚本目录下的虚拟环境
    if [[ -f "$script_venv" ]]; then
        echo "$script_venv"
        return 0
    fi
    
    # 其次检查项目根目录下的虚拟环境
    if [[ -f "$project_venv" ]]; then
        echo "$project_venv"
        return 0
    fi
    
    # 如果没有虚拟环境，尝试系统Python
    local system_python3="/usr/bin/python3"
    local homebrew_python="/opt/homebrew/bin/python3"
    
    if [[ -x "$homebrew_python" ]]; then
        echo "$homebrew_python"
        return 0
    fi
    
    if [[ -x "$system_python3" ]]; then
        echo "$system_python3"
        return 0
    fi
    
    # 最后尝试which命令
    which python3 2>/dev/null || which python 2>/dev/null || echo "python3"
}

PYTHON_EXEC=$(detect_python_path)

# 调度器脚本路径
SCHEDULER_SCRIPT="$SCRIPT_DIR/sina_auto_crawler.py"

# 日志目录
LOG_DIR="$SCRIPT_DIR/logs"
CRON_LOG_FILE="$LOG_DIR/cron_execution.log"

# Crontab标识符（用于识别我们的定时任务）
CRON_MARKER="# Sina Lottery Crawler Jobs"
CRON_START_MARKER="$CRON_MARKER - START"
CRON_END_MARKER="$CRON_MARKER - END"

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查环境
check_environment() {
    log_info "检查运行环境..."
    
    # 显示检测到的Python路径
    log_info "Python路径检测结果: $PYTHON_EXEC"
    
    # 检查Python是否可用
    if [[ ! -f "$PYTHON_EXEC" ]] && [[ ! -x "$PYTHON_EXEC" ]]; then
        log_error "Python执行器不存在: $PYTHON_EXEC"
        
        log_info "可用的虚拟环境位置检查："
        local script_venv="$SCRIPT_DIR/venv/bin/python"
        local project_venv="$PROJECT_ROOT/venv/bin/python"
        
        if [[ -f "$script_venv" ]]; then
            echo "  ✅ 脚本目录虚拟环境: $script_venv"
        else
            echo "  ❌ 脚本目录虚拟环境: $script_venv (不存在)"
        fi
        
        if [[ -f "$project_venv" ]]; then
            echo "  ✅ 项目根目录虚拟环境: $project_venv"
        else
            echo "  ❌ 项目根目录虚拟环境: $project_venv (不存在)"
        fi
        
        log_info "创建虚拟环境的建议命令:"
        echo "  选项1 (脚本目录): cd $SCRIPT_DIR && python3 -m venv venv"
        echo "  选项2 (项目根目录): cd $PROJECT_ROOT && python3 -m venv venv"
        echo "  然后: source venv/bin/activate && pip install requests pymysql"
        exit 1
    fi
    
    # 检查调度器脚本
    if [[ ! -f "$SCHEDULER_SCRIPT" ]]; then
        log_error "调度器脚本不存在: $SCHEDULER_SCRIPT"
        exit 1
    fi
    
    # 创建日志目录
    mkdir -p "$LOG_DIR"
    
    log_success "环境检查通过"
}

# 生成crontab配置
generate_crontab_config() {
    cat << EOF
$CRON_START_MARKER

# 每日彩票数据抓取定时任务
# 项目路径: $SCRIPT_DIR

# 21:25 - 福彩双色球、3D、七乐彩开奖结果
25 21 * * * cd $SCRIPT_DIR && $PYTHON_EXEC $SCHEDULER_SCRIPT  >> $CRON_LOG_FILE 2>&1

# 21:40 - 体彩彩种和福彩快乐8开奖结果
40 21 * * * cd $SCRIPT_DIR && $PYTHON_EXEC $SCHEDULER_SCRIPT  >> $CRON_LOG_FILE 2>&1
# 22:10 - 更新各彩种各奖项中奖信息
10 22 * * * cd $SCRIPT_DIR && $PYTHON_EXEC $SCHEDULER_SCRIPT >> $CRON_LOG_FILE 2>&1

# 23:30 - 防止彩种各奖项更新延迟，再进行更新一遍
30 23 * * * cd $SCRIPT_DIR && $PYTHON_EXEC $SCHEDULER_SCRIPT >> $CRON_LOG_FILE 2>&1

$CRON_END_MARKER
EOF
}

# 预览定时任务配置
preview_crontab() {
    log_info "预览将要安装的定时任务配置:"
    echo "============================================"
    generate_crontab_config
    echo "============================================"
    
    log_info "定时任务说明:"
    echo "  21:25 - 抓取福彩双色球、3D、七乐彩开奖结果"
    echo "  21:40 - 抓取体彩彩种和福彩快乐8开奖结果"
    echo "  22:10 - 更新各彩种各奖项中奖信息"
    echo "  23:30 - 延迟更新防止遗漏"
    echo ""
    echo "  日志文件: $CRON_LOG_FILE"
    echo "  Python路径: $PYTHON_EXEC"
    echo "  脚本路径: $SCHEDULER_SCRIPT"
}

# 安装定时任务
install_crontab() {
    log_info "开始安装彩票抓取定时任务..."
    
    # 检查环境
    check_environment
    
    # 获取当前crontab
    CURRENT_CRONTAB=$(crontab -l 2>/dev/null || echo "")
    
    # 检查是否已经安装
    if echo "$CURRENT_CRONTAB" | grep -q "$CRON_START_MARKER"; then
        log_warning "检测到已存在的定时任务，将先卸载旧版本..."
        uninstall_crontab_silent
    fi
    
    # 创建临时文件
    TEMP_CRONTAB=$(mktemp)
    
    # 保留现有的crontab内容（如果有的话）
    if [[ -n "$CURRENT_CRONTAB" ]]; then
        echo "$CURRENT_CRONTAB" > "$TEMP_CRONTAB"
        echo "" >> "$TEMP_CRONTAB"  # 添加空行
    fi
    
    # 添加我们的定时任务
    generate_crontab_config >> "$TEMP_CRONTAB"
    
    # 安装新的crontab
    if crontab "$TEMP_CRONTAB"; then
        log_success "定时任务安装成功！"
        
        # 显示安装的任务
        log_info "已安装的彩票抓取任务:"
        crontab -l | grep -A 20 "$CRON_START_MARKER" | grep -B 20 "$CRON_END_MARKER"
        
        log_info "任务执行日志位置: $CRON_LOG_FILE"
        log_info "可以使用以下命令查看日志:"
        echo "  tail -f $CRON_LOG_FILE"
        
    else
        log_error "定时任务安装失败！"
        rm -f "$TEMP_CRONTAB"
        exit 1
    fi
    
    # 清理临时文件
    rm -f "$TEMP_CRONTAB"
    
    # 创建日志文件（如果不存在）
    touch "$CRON_LOG_FILE"
    
    log_success "✅ 彩票定时抓取任务配置完成！"
}

# 静默卸载（内部使用）
uninstall_crontab_silent() {
    CURRENT_CRONTAB=$(crontab -l 2>/dev/null || echo "")
    
    if echo "$CURRENT_CRONTAB" | grep -q "$CRON_START_MARKER"; then
        # 移除我们的定时任务
        TEMP_CRONTAB=$(mktemp)
        echo "$CURRENT_CRONTAB" | sed "/$CRON_START_MARKER/,/$CRON_END_MARKER/d" > "$TEMP_CRONTAB"
        
        # 移除末尾的空行
        sed -i '' '/^$/N;/^\n$/d' "$TEMP_CRONTAB" 2>/dev/null || sed -i '/^$/N;/^\n$/d' "$TEMP_CRONTAB"
        
        crontab "$TEMP_CRONTAB"
        rm -f "$TEMP_CRONTAB"
    fi
}

# 卸载定时任务
uninstall_crontab() {
    log_info "开始卸载彩票抓取定时任务..."
    
    CURRENT_CRONTAB=$(crontab -l 2>/dev/null || echo "")
    
    if ! echo "$CURRENT_CRONTAB" | grep -q "$CRON_START_MARKER"; then
        log_warning "未找到彩票抓取定时任务，可能已经被卸载"
        return 0
    fi
    
    uninstall_crontab_silent
    
    log_success "定时任务卸载成功！"
}

# 显示当前定时任务
show_crontab() {
    log_info "当前用户的所有定时任务:"
    echo "============================================"
    
    CURRENT_CRONTAB=$(crontab -l 2>/dev/null || echo "")
    
    if [[ -z "$CURRENT_CRONTAB" ]]; then
        echo "当前没有定时任务"
    else
        echo "$CURRENT_CRONTAB"
    fi
    
    echo "============================================"
    
    # 检查我们的任务
    if echo "$CURRENT_CRONTAB" | grep -q "$CRON_START_MARKER"; then
        log_success "✅ 彩票抓取定时任务已安装"
    else
        log_warning "⚠️ 彩票抓取定时任务未安装"
    fi
}

# 测试定时任务
test_jobs() {
    log_info "测试彩票抓取定时任务..."
    
    check_environment
    
    cd "$SCRIPT_DIR"
    
    log_info "测试福彩主要彩种抓取..."
    if $PYTHON_EXEC "$SCHEDULER_SCRIPT" --test fucai_main; then
        log_success "福彩主要彩种测试通过"
    else
        log_error "福彩主要彩种测试失败"
        exit 1
    fi
    
    log_info "测试体彩和快乐8抓取..."
    if $PYTHON_EXEC "$SCHEDULER_SCRIPT" --test ticai_and_kl8; then
        log_success "体彩和快乐8测试通过"
    else
        log_error "体彩和快乐8测试失败"
        exit 1
    fi
    
    log_success "🎉 所有测试通过！定时任务配置正确"
}

# 显示状态
show_status() {
    echo "🔍 彩票抓取定时任务状态检查"
    echo "============================================"
    
    # 检查环境
    log_info "检查运行环境..."
    echo "  检测到的Python执行器: $PYTHON_EXEC"
    if [[ -f "$PYTHON_EXEC" ]] || [[ -x "$PYTHON_EXEC" ]]; then
        echo "    ✅ 存在且可用"
        PYTHON_VERSION=$($PYTHON_EXEC --version 2>&1)
        echo "    版本: $PYTHON_VERSION"
    else
        echo "    ❌ 不存在或不可用"
    fi
    
    # 显示虚拟环境检测详情
    echo "  虚拟环境检测详情:"
    local script_venv="$SCRIPT_DIR/venv/bin/python"
    local project_venv="$PROJECT_ROOT/venv/bin/python"
    
    if [[ -f "$script_venv" ]]; then
        echo "    ✅ 脚本目录虚拟环境: $script_venv"
    else
        echo "    ❌ 脚本目录虚拟环境: $script_venv"
    fi
    
    if [[ -f "$project_venv" ]]; then
        echo "    ✅ 项目根目录虚拟环境: $project_venv"
    else
        echo "    ❌ 项目根目录虚拟环境: $project_venv"
    fi
    
    echo "  调度器脚本: $SCHEDULER_SCRIPT"
    if [[ -f "$SCHEDULER_SCRIPT" ]]; then
        echo "    ✅ 存在"
    else
        echo "    ❌ 不存在"
    fi
    
    echo "  日志目录: $LOG_DIR"
    if [[ -d "$LOG_DIR" ]]; then
        echo "    ✅ 存在"
    else
        echo "    ❌ 不存在"
    fi
    
    echo "  执行日志: $CRON_LOG_FILE"
    if [[ -f "$CRON_LOG_FILE" ]]; then
        echo "    ✅ 存在"
        FILE_SIZE=$(du -h "$CRON_LOG_FILE" | cut -f1)
        echo "    大小: $FILE_SIZE"
    else
        echo "    ❌ 不存在"
    fi
    
    echo ""
    
    # 检查crontab
    log_info "检查定时任务..."
    CURRENT_CRONTAB=$(crontab -l 2>/dev/null || echo "")
    
    if echo "$CURRENT_CRONTAB" | grep -q "$CRON_START_MARKER"; then
        echo "  ✅ 定时任务已安装"
        echo "  已安装的任务："
        echo "$CURRENT_CRONTAB" | grep -A 20 "$CRON_START_MARKER" | grep -B 20 "$CRON_END_MARKER" | sed 's/^/    /'
    else
        echo "  ❌ 定时任务未安装"
    fi
    
    echo "============================================"
}

# 显示帮助信息
show_help() {
    echo "🎯 新浪彩票定时抓取 - Crontab 配置脚本"
    echo ""
    echo "用法: $0 [命令]"
    echo ""
    echo "命令:"
    echo "  install     安装定时任务"
    echo "  uninstall   卸载定时任务"
    echo "  show        显示当前所有定时任务"
    echo "  preview     预览将要安装的定时任务配置"
    echo "  test        测试定时任务功能"
    echo "  status      显示完整状态信息"
    echo "  help        显示此帮助信息"
    echo ""
    echo "定时任务计划:"
    echo "  21:25 - 福彩双色球、3D、七乐彩开奖结果"
    echo "  21:40 - 体彩彩种和福彩快乐8开奖结果"
    echo "  22:10 - 更新各彩种各奖项中奖信息"
    echo "  23:30 - 防止彩种各奖项更新延迟，再进行更新一遍"
    echo ""
    echo "示例:"
    echo "  $0 install    # 安装定时任务"
    echo "  $0 status     # 查看状态"
    echo "  $0 test       # 测试功能"
}

# 主逻辑
main() {
    case "${1:-help}" in
        "install")
            install_crontab
            ;;
        "uninstall")
            uninstall_crontab
            ;;
        "show")
            show_crontab
            ;;
        "preview")
            preview_crontab
            ;;
        "test")
            test_jobs
            ;;
        "status")
            show_status
            ;;
        "help"|"--help"|"-h")
            show_help
            ;;
        *)
            log_error "未知命令: $1"
            echo ""
            show_help
            exit 1
            ;;
    esac
}

# 执行主函数
main "$@"
